perm filename XAP2[XAP,BGB] blob sn#058608 filedate 1973-08-21 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00007 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001	   VALID 00006 PAGES 
C00002 00002	SUBR(MKSEG0)	MAKE LINE SEGMENT.  CLIPPER.
C00005 00003	SUBR(MKSEG1)	MAKE LINE SEGMENT.
C00008 00004	SUBR(IIISIM)	OUTPUT III BUFFER ONTO XGP.
C00010 00005		FETCH AND DECODE III COMMAND WORD.
C00012 00006		EXECUTE VECTORS.
C00015 00007	SUBR(VIDEO)
C00018 ENDMK
C⊗;
SUBR(MKSEG0)	MAKE LINE SEGMENT.  CLIPPER.
BEGIN MKSEG0;_____________________________________________________
	ACCUMULATORS{R1,C1,R2,C2,Q,N}
;TEST FOR EASY OUTSIDER.
	LAC Q,C1↔LAC N,C2↔CAMLE C1,C2↔EXCH Q,N
	CAIG Q,=1727↔SKIPGE N↔POP0J
	LAC Q,R1↔LAC N,R2↔CAMLE R1,R2↔EXCH Q,N
	CAMG Q,QHI↔CAMGE N,QLO↔POP0J
;TEST FOR EASY INSIDER.
	JUMPL C1,L1↔JUMPL C2,L1
	CAILE C1,=1727↔GO L1↔CAILE C2,=1727↔GO L1
	CAMLE R1,QHI↔GO L1↔CAMLE R2,QHI↔GO L1
	CAMGE R1,QLO↔GO L1↔CAMGE R2,QLO↔GO L1↔GO MKSEG1	;DISPLAY.
;TEST FOR AND HANDLE SIMPLE CASES.
L1:	CAMN R1,R2↔GO[
	CAMN C1,C2↔POP0J↔GO HSEG]
	CAMN C1,C2↔GO VSEG
;MIDPOINT THE HARD CASE.
	PUSH P,R1↔PUSH P,C1	;SAVE 1ST END.
	ADD R1,R2↔ASH R1,-1	;MIDPOINT THE LINE SEGMENT.
	ADD C1,C2↔ASH C1,-1
;TEST FOR MIDPOINT AND 1ST END BEING COINCIDANT.
	CAMN R1,-1(P)↔GO[
	CAME C1, 0(P)↔GO .+1↔POP P,C1↔POP P,R1↔POP0J]
;RECURSION - DISPLAY ONE HALF AND THEN DISPLAY THE OTHER.
	CALL(MKSEG0)			;MIDPOINT TO 2ND END.
	LAC R2,-1(P)↔LAC C2,0(P)   
	CALL(MKSEG0)			;MIDPOINT TO 1ST END.
	POP P,C1↔POP P,R1↔POP0J
;DISPLAY HORIZONTAL LINE SEGMENT FROM (C1 MIN C2) TO (C1 MAX C2).
HSEG:	LAC Q,C1↔LAC N,C2↔CAML C1,C2↔EXCH N,Q
	SKIPGE Q↔SETZ Q,↔CAILE N,=1727↔LACI N,=1727↔SUB N,Q
	DOT(R1,Q)↔SKIPA↔IDPB 0,1↔SOJG N,.-1↔POP0J
;DISPLAY VERTICAL LINE SEGMENT FROM (R1 MIN R2) TO (R1 MAX R2).
VSEG:	LAC Q,R1↔LAC N,R2↔CAML R1,R2↔EXCH N,Q
	CAMGE Q,QLO↔LAC Q,QLO↔CAMLE N,QHI↔LAC N,QHI↔SUB N,Q
	DOT(Q,C1)↔ADDI 1,WWIDTH
	SOJG N,.-2↔POP0J
BEND MKSEG0;BGB 24 APRIL 1973.____________________________________
SUBR(MKSEG1)	MAKE LINE SEGMENT.
COMMENT / Recursive midpoint method of quantizing a line segment.
Arguments are expected in accumulators R1, C1, R2, C2; the bit
is deposited from accumulator 0./
BEGIN MKSEG1;_____________________________________________________
	ACCUMULATORS{R1,C1,R2,C2,Q,N}

;TEST FOR AND HANDLE SIMPLE CASES.
	CAMN R1,R2↔GO[
	CAMN C1,C2↔GO[DOT(R1,C1)↔POP0J]↔GO HSEG]
	CAMN C1,C2↔GO VSEG

;MIDPOINT THE HARD CASE.
	PUSH P,R1↔PUSH P,C1	;SAVE 1ST END.
	ADD R1,R2↔ASH R1,-1	;MIDPOINT THE LINE SEGMENT.
	ADD C1,C2↔ASH C1,-1

;TEST FOR MIDPOINT AND 1ST END BEING COINCIDANT.
	CAMN R1,-1(P)↔GO[
	CAME C1, 0(P)↔GO .+1↔POP P,C1↔POP P,R1
	DOT(R1,C1)↔DOT(R2,C2)↔POP0J]

;RECURSION - DISPLAY ONE HALF AND THEN DISPLAY THE OTHER.
	CALL(MKSEG1)			;MIDPOINT TO 2ND END.
	LAC R2,-1(P)↔LAC C2,0(P)   
	CALL(MKSEG1)			;MIDPOINT TO 1ST END.
	POP P,C1↔POP P,R1↔POP0J

;DISPLAY HORIZONTAL LINE SEGMENT FROM (C1 MIN C2) TO (C1 MAX C2).
HSEG:	LAC Q,C1↔LAC N,C2
	CAML C1,C2↔EXCH N,Q↔SUB N,Q
	DOT(R1,Q)↔SKIPA↔IDPB 0,1
	SOJG N,.-1↔POP0J

;DISPLAY VERTICAL LINE SEGMENT FROM (R1 MIN R2) TO (R1 MAX R2).
VSEG:	LAC Q,R1↔LAC N,R2
	CAML R1,R2↔EXCH N,Q↔SUB N,Q
	DOT(Q,C1)↔ADDI 1,WWIDTH
	SOJG N,.-2↔POP0J

BEND MKSEG1;BGB 24 APRIL 1973.____________________________________
SUBR(IIISIM)	OUTPUT III BUFFER ONTO XGP.
BEGIN IIISIM______________________________________________________

	ACCUMULATORS{X,Y,R,C,IIIWRD}

;DELTA ORIGIN DISPLACEMENT.
	SLACI 1,(2B2)↔LAC CHAR
	CAIN"*"↔SETZ 1,↔DAC 1,DELTA#

;III FILE NAME.
	CALL(GETFIL)
	INIT 17,17↔SIXBIT/DSK/↔0
	GO[FATAL(CAN'T INIT DSK)]
	LOOKUP 17,FILNAM↔GO[LAC[SIXBIT/PLT/]↔DAC EXTION
	  LOOKUP 17,FILNAM↔GO[LAC[SIXBIT/III/]↔DAC EXTION
	    LOOKUP 17,FILNAM↔GO[LAC[SIXBIT/DAT/]↔DAC EXTION
	      LOOKUP 17,FILNAM↔GO[FATAL<III FILE NOT FOUND.>]
	      GO L0]↔GO L0]↔GO L0]

;EXPAND CORE FOR DUMP INPUT.
L0:	LAC JOBREL↔DAC OLD44#
	NIP 1,PPPN↔MOVN 1,1
	ADD 1,JOBREL↔DAC 1,BUFEND#
	CORE 1,↔GO[FATAL(CAN'T EXPAND CORE)]

;SAVE CURRENT XGP BEAM POSITION.
	LAC COL↔DAC BEGCOL#
	LAC ROW↔DAC BEGROW#

;DUMP III FILE IN.
	LAC OLD44↔ADDM PPPN↔IN 17,PPPN
	LAC 1,OLD44↔LAC(1)↔CAMN[-1]↔GO VIDEO
	LAC 1,OLD44↔ADDI 1,2↔DAC 1,PC#			;III PC.
L1:	CDR 1,BUFEND↔DZM -1(1)↔DZM(1)
        CAML 1,JOBREL↔GO .+3
	LIPI 1,-1(1)↔BLT 1,JOBREL		;CLEAR TOP.
	;FETCH AND DECODE III COMMAND WORD.
ILOOP:	AOSA 1,PC
LOOP:	LAC 1,PC↔CAMLE 1,JOBFF
	CAML 1,BUFEND↔GO RET
	LAC  IIIWRD,(1)
	TRNE IIIWRD,01↔GO XTEXT		;TEXT COMMAND WORD.
	TRNE IIIWRD,02↔GO XVECTR	;VECTOR COMMAND WORD.
	TRNE IIIWRD,20↔GO XCTRL		;III CONTROL WORD.
	TRNE IIIWRD,37↔GO ILOOP		;NOP & HALT COMMANDS.
RET:	LAC OLD44↔CORE↔GO[FATAL(CAN'T SHRINK CORE!)]
FRET:	RELEASE 17,
	LAC BEGCOL↔DAC COL
	LAC BEGROW↔DAC ROW
	POP0J

;EXECUTE III TEXT.
XTEXT:	PUSH P,IIIWRD			;-2(P)
	PUSH P,[5]			;-1(P)
	PUSH P,[POINT 7,-2(P)]		; 0(P)
CLOOP:	ILDB 1,0(P)
	JUMPE 1,CCONT
	CAIN 1,15↔GO[LAC -4(P)↔DAC COL↔GO CCONT]
	DAC 1,CHAR
	CALL(PRINT)
CCONT:	SOSLE -1(P)↔GO CLOOP
	SUB P,[XWD 3,3]
	GO ILOOP


;EXECUTE III CONTROL OPERATIONS.
XCTRL:	TRNN IIIWRD,04↔GO[CAR 1,IIIWRD↔DAC 1,PC↔GO LOOP]  ;JUMP.
	TRNE IIIWRD,40↔GO LOOP			;SAVE A NOP HERE
	AOS 1,PC	;JSR
	HRLI 1,20
	CAR 2,IIIWRD
	CAMLE 2,JOBFF
	CAML 2,BUFEND↔GO[ OUTSTR[ASCIZ/JSR OUT OF BOUNDS
/]↔	GO RET]
	DAC 1,(2)↔DAC 2,PC
	GO ILOOP
	;EXECUTE VECTORS.
XVECTR:	TRNN IIIWRD,4
	GO [TRNN IIIWRD,10	;SHORT VECTOR OR TSS
	    GO SVECT		;SHORT VECTOR
	    GO ILOOP]		;TSS
	LDB [POINT 11,IIIWRD,10]↔ROT -13↔DAC X		;X FIELD.
	LDB [POINT 11,IIIWRD,21]↔ROT -13↔DAC Y		;Y FIELD
	LDB 1,[POINT 3,IIIWRD,31]↔CALL(VECTOR)		;OP CODE.
	GO ILOOP

SVECT:	PUSH P,IIIWRD				;SAVE III COMMAND.
	LDB [POINT 7,IIIWRD,06]↔ROT -7↔ASH -4↔DAC X	;X FIELD.
	LDB [POINT 7,IIIWRD,13]↔ROT -7↔ASH -4↔DAC Y	;Y FIELD.
	LDB 1,[POINT 2,IIIWRD,15]↔CALL(VECTOR)		;OP CODE.
	POP P,IIIWRD				;RESTORE III COMMAND.
	LDB [POINT 7,IIIWRD,22]↔ROT -7↔ASH -4↔DAC X	;X FIELD.
	LDB [POINT 7,IIIWRD,29]↔ROT -7↔ASH -4↔DAC Y   	;Y FIELD.
	LDB 1,[POINT 2,IIIWRD,31]↔CALL(VECTOR)		;OP CODE.
	GO ILOOP

VECTOR:	SETO↔TRNE 1,2↔SETZ		;SKIP ON VISIBLE VECTOR.
	TRNE 1,4↔GO .+3			;SKIP ON RELATIVE VECTOR.
 	ADD X,XBEAM↔ADD Y,YBEAM
	DAC X,XBEAM↔DAC Y,YBEAM
	LACN R,Y↔ADD R,DELTA↔MUL R,IIIDY↔ADD R,BEGROW	;Y INTO ROW.
	LAC  C,X↔ADD C,DELTA↔MUL C,IIIDX↔ADD C,BEGCOL	;X INTO COL.
	TRNN 1,1↔GO .+4			;SKIP ON POINT.
	LAC 2,R↔LAC 3,C↔GO .+3		;POINT.
	LAC 2,ROW↔LAC 3,COL		;FROM OLD XGP BEAM POSITION.
	DAC R,ROW↔DAC C,COL		;SAVE NEW XGP BEAM POSITION.
	SKIPE↔CALL(MKSEG0)↔POP0J	;PLOT VECTOR - POP STACK.

DECLARE{XBEAM,YBEAM}
BEND IIISIM;2/8/73(TVR)8/21/73(BGB)----------------------------------
SUBR(VIDEO)
BEGIN VIDEO;_________________________________________________________
	ACCUMULATORS{S2,S3,I,J,K,Q,P1,P2,R,C,TV}

COMMENT⊗ VIDEO FILE HEADER:
	0	-1
	1	6	BITS PER BYTE.
	2	=48	WORDS PER ROW.
	3	R1
	4	R2
	5	C1
	6	C2
	7	-WC,,ADR ⊗

;EXPECT AC-1 TO CONTAIN POINTER TO WORD ZERO OF VIDEO FILE IN CORE.
	LAC TV,1↔LAC 2(TV)↔DAC TVWIDTH#
	LAC 4(TV)↔SUB 3(TV)↔AOS↔DAC TVROWS#↔DZM TVROW0#
	LAC 6(TV)↔SUB 5(TV)↔AOS↔DAC TVCOLS#
	LAC R,ROW↔TRZ R,3    ;UPPER LEFT MOST CORNER OF IMAGE.
	CAMLE R,QHI↔POP0J    ;WHOLE VIDEO IMAGE BELOW THIS QPAGE.
	CAML R,QLO↔GO L0     ;VIDEO IMAGE STARTS ON THIS QPAGE.

;VIDEO IMAGE STARTS BEFORE THIS QUARTER PAGE.
L00:	SUB R,QLO↔ASH R,-2
	MOVM R,R↔DAC R,TVROW0#
	CAML R,TVROWS↔POP0J  ;WHOLE VIDEO IMAGE ABOVE THIS QPAGE.
	SUB R,TVROWS
	DACM R,TVROWS↔LAC R,QLO

;VIDEO BYTE POINTER.
L0:	LAC P1,1(TV)		;BYTE SIZE.
	IORI P1,4400↔ROT P1,-=12
	LAP P1,7(TV)↔ADD P1,1	;ORIGIN OF VIDEO IN CORE.
	LAC TVROW0↔IMUL TVWIDTH↔ADD P1,0

;POINTER INTO XGP BUFFER.
	LAC C,COL
	HLLZ 1,%(C)↔ROT 1,6
	HRRI 1,@%(R)↔CDR P2,1
;J = COLUMNS/9			9 4-BIT XGP BYTES PER WORD.
	LACI J,=36↔IDIV J,1(TV)
	IMUL J,2(TV)↔IDIVI J,=9↔DAC J,JSAV#	;COLUMNS/9
	LAC I,TVROWS
L1:	DAC P2,P2SAV#↔LAC J,JSAV
L2:	SETZB 0,1↔SETZB 2,3↔LACI K,=9
L3:	ILDB Q,P1
	TRZ Q,3↔ROTC 0,4↔ROTC 2,4
	IOR 0,HTT+0(Q)↔IOR 1,HTT+1(Q)
	IOR 2,HTT+2(Q)↔IOR 3,HTT+3(Q)↔SOJG K,L3
	CAIL C,=1728↔GO L4
	IORM 0,0*WWIDTH(P2)↔IORM 1,1*WWIDTH(P2)
	IORM 2,2*WWIDTH(P2)↔IORM 3,3*WWIDTH(P2)
L4:	AOS P2↔SOJG J,L2
	ADDI R,4↔CAMLE R,QHI↔POP0J
	LAC P2,P2SAV↔ADDI P2,4*WWIDTH
	SOJG I,L1
	POP0J
;HALF TONE TABLE.
HTT:	6↔7↔7↔6↔	6↔6↔7↔6↔	6↔6↔6↔6↔	6↔6↔6↔6
	6↔6↔6↔4↔	4↔6↔6↔4↔	4↔6↔6↔4↔	4↔4↔6↔4
	4↔4↔4↔4↔	4↔4↔4↔4↔	0↔4↔4↔4↔	4↔4↔4↔0
	0↔4↔4↔0↔	0↔0↔4↔0↔	0↔0↔4↔0↔	0↔0↔0↔0
BEND VIDEO;BGB 2 JUNE 1973.__________________________________________